public class M如何计算一个数的n次方 {

    /**
     * 给定一个数d和n，如何计算d的n次方？例如，d=2、n=3，d的n次方为2^3=8
     *
     * 由于方法一没有充分利用中间的计算结果，因此，算法效率还有很大的提升余地。
     * 例如，在计算2的100次方时，假如已经计算出了2的50次方的值tmp=2^50，就没必要对tmp再乘以50次2，
     * 而可以直接利用tmp*tmp就得到了2^100的值。可以利用这个特点给出递归实现方法如下：1）n=0，
     * 那么计算结果肯定为1。2）n=1，计算结果肯定为d。3）n＞0，
     * 首先计算2^（n/2）的值tmp；如果n为奇数，那么计算结果result=tmp*tmp*d；如果n为偶数，
     * 那么计算结果result=tmp*tmp。4）n＜0，首先计算2^（|n/2|）的值tmp；如果n为奇数，
     * 那么计算结果result=1/（tmp*tmp*d）；如果n为偶数，那么计算结果result=1/（tmp*tmp）
     */
    public static double power(double d,int n){
        if (n == 0) {
            return 1;
        }
        if (n == 1) {
            return d;
        }
        double tmp=power(d,Math.abs(n/2));
        if (n > 0) {
            if (Math.abs(n % 2) == 1) {
                return tmp*tmp*d;
            }else {
                //n为偶数
                return tmp*tmp;
            }
        }else{
            if (Math.abs(n % 2) == 1) {
                return 1/(tmp*tmp*d);
            }else {
                return 1/(tmp*tmp);
            }
        }
    }

    public static void main(String[] args) {

        System.out.println(power(2,500));
    }
}
